'''
【说明】基于LittleC规则的词法分析器 接收单行或多行文本输入 最终得到词法的token序列 [ [类型,内容]...[类型,内容] ] 命名为tokens
【词法】
*运算符: + - * / = > < >= <= == != 
*分隔符: (){},;  
*整数常量 正数即全是数字的字符串 0即字符0  负数即'-'后接正数
*自定义标识符: 以字母或下划线开头 后跟字母 数字 下划线
*保留字：int if else while 
【token】
*token 单词二元组 形式为 [type,content]
*type是词类型标记(为整数):0(运算符) | 1(分隔符) | 2（整数常量）| 3(自定义标识符) | 4(保留字)
【tokens】
*tokens 单词二元组序列 形式为 [token,token,...,token]
'''

'''  
规约常量表
'''
#有穷集合词符列表
separators=[')','(','}','{',',',';']
sOperators=['=','+','-','*','/','>','<']
dOperators=['=','<','>','!']
keyWords=['int','if','else','while']

'''
函数表
|-process()   #词法处理器
'''
#process()词法处理器 返回分词后的单词token序列
#oldLines 接受(键盘输入的或文件中的)单行文本或(文件中的)多行文本 进行处理
def process(oldLines):
  lines=[oldLines]  if isinstance(oldLines,str) else oldLines
  #1.初始化
  #1.1初始化标志组
  flagInteger=False      #整数标志
  flagId=False           #标识符(含关键字)标志
  flagDOp=False          #双字符算符标志 
  #1.2初始化容器
  tmpWords=''
  tokens=[] 
  #2.遍历每一行
  for line in lines:
    line+=' '                           #补一个空串 预防行结尾没有换行导致的判断丢失
    for char in line:
      #2.1 优先级高的判符
      if flagDOp:
        if char=='=':                   #是多目比较符
          tmpWords+='='
          tokens.append([0,tmpWords])
          flagDOp=False                 #待定
          tmpWords=''                   #待定
          continue
        elif char!='!':                 #只要不是! 就是一个单目比较符
          tokens.append([0,tmpWords])  
        flagDOp=False
        tmpWords=''
      elif flagInteger:
        if char.isdigit():
          tmpWords+=char
          continue
        else:
          tokens.append([2,tmpWords])  
          flagInteger=False
          tmpWords=''
      elif flagId:
        if char.isalpha() or char.isdigit() or char=='_':
          tmpWords+=char
          continue
        elif tmpWords in keyWords:
          tokens.append([4,tmpWords]) 
        else:
          tokens.append([3,tmpWords])
        flagId=False
        tmpWords=''

      #2.2  低优先级判断
      if char in separators:            #分隔符判断
        tokens.append([1,char])
      elif char in dOperators:          #多目算符疑似判断
        tmpWords+=char
        flagDOp=True
      elif char in sOperators:          #单目算符判断
        tokens.append([0,char]) 
      elif char.isalpha() or char=='_': #标识符或者保留字的疑似判断 遇到字母或者下划线 开头
        tmpWords+=char
        flagId=True 
      elif char.isdigit() or char=="-":               #整数的疑似判断  遇到数字开头
        tmpWords+=char
        flagInteger=True
      else:                              #其他情况 这种的暂时不加以处理      
        pass        
  return tokens


      